#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 1010;

int n,m;
int f[N];
struct Thing
{
    int kind; // 什么类型，0/1 背包，完全背包，多重背包
    int v,w;
};
vector<Thing> things;

int main()
{
    cin >> n >> m;
    for(int i = 0;i < n;++i)
    {
        int v,w,s;
        cin >> v >> w >> s;
        if(s < 0) things.push_back({-1,v,w});
        else if(0 == s) things.push_back({0,v,w});
        else
        {
            for(int k = 1; k <= s;k *= 2)
            {
                s -= k;
                things.push_back({-1,k*v,k*w});
            }
            if(s > 0) things.push_back({1,v*s,w*s});
        }
    }
    for(auto thing : things)
    {
        if(thing.kind < 0)
        {
            for(int j = m; j >= thing.v;--j) 
                f[j] = max(f[j],f[j - thing.v] + thing.w);
        }
        else
        {
            for(int j = thing.v;j <= m;++j)
                f[j] = max(f[j],f[j - thing.v] + thing.w);
        }
    }
    cout << f[m] << endl;
    return 0;
}